home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
DEMON
/
LANGUAGE
/
POTSRC.ARC
/
src
/
mod
/
coco
< prev
next >
Wrap
Text File
|
1995-01-22
|
4KB
|
131 lines
MODULE COCO; (* DVD 04 09 1993 00:12 *)
IMPORT Files, Strings, COCS; (* to mark *)
(* C Output *)
CONST
UnxNL = 0AX; MacNL = 0DX;
IndWidth = 2;
CLineLength = 80;
VAR
fold*, linenum*, macwrap*, unxwrap*: BOOLEAN;
NL: ARRAY 2 OF CHAR;
NLlen: INTEGER;
ofile: Files.File;
Output: Files.Rider;
indlevel: INTEGER;
newline: BOOLEAN;
txtline: LONGINT;
cpos: INTEGER;
PROCEDURE Size*(): LONGINT;
BEGIN RETURN Files.Pos(Output) + 1
END Size;
PROCEDURE Open*(VAR name: ARRAY OF CHAR);
BEGIN ofile := Files.New(name); IF ofile = NIL THEN HALT(21H) END;
Files.Set(Output,ofile,0);
indlevel := 0; txtline := 1; newline := TRUE; cpos := 0;
NLlen := 0;
IF macwrap THEN NL[NLlen] := MacNL; INC(NLlen) END;
IF unxwrap THEN NL[NLlen] := UnxNL; INC(NLlen) END;
IF NLlen = 0 THEN NL[NLlen] := UnxNL; INC(NLlen) END
END Open;
PROCEDURE Close*;
BEGIN Files.Set(Output, NIL, 0); Files.Close(ofile)
END Close;
PROCEDURE Purge*;
BEGIN Files.Set(Output, NIL, 0); Files.Purge(ofile)
END Purge;
PROCEDURE Indent*;
BEGIN INC(indlevel, IndWidth)
END Indent;
PROCEDURE Undent*;
BEGIN IF indlevel >= IndWidth THEN DEC(indlevel, IndWidth) END
END Undent;
PROCEDURE Separate*;
BEGIN Files.Write(Output, " ");
END Separate;
PROCEDURE Wrap*;
VAR i: INTEGER;
linepgm: ARRAY 7 OF CHAR;
lineno: ARRAY 11 OF CHAR;
BEGIN
newline := TRUE;
Files.WriteBytes(Output, NL, NLlen);
IF linenum & (txtline # COCS.txtpos.line) THEN
linepgm := "#line ";
Strings.FromLInt(COCS.txtpos.line, 10, lineno);
Files.WriteBytes(Output, linepgm, Strings.Length(linepgm));
Files.WriteBytes(Output, lineno, Strings.Length(lineno));
Files.Write(Output, " "); Files.Write(Output, 22X);
Files.WriteBytes(Output, COCS.txtpos.name, Strings.Length(COCS.txtpos.name));
Files.Write(Output, 22X); Files.WriteBytes(Output, NL, NLlen);
txtline := COCS.txtpos.line
END;
INC(txtline)
END Wrap;
PROCEDURE PutSeq*(s: ARRAY OF CHAR);
VAR i, j: INTEGER;
BEGIN
IF newline THEN
newline := FALSE; i := 0;
WHILE i # indlevel DO Files.Write(Output, " "); INC(i) END;
cpos := i
END;
i := 0; j := 0; WHILE s[i] = " " DO INC(i) END;
IF fold THEN
LOOP
IF i # j THEN s[j] := s[i] END;
IF s[j] = 0X THEN EXIT END;
INC(i); INC(j);
IF (cpos >= CLineLength) & ((s[i] = "(") OR (s[i] = ")")) THEN
Files.WriteBytes(Output, s, j);
Files.Write(Output, "\"); Files.WriteBytes(Output, NL, NLlen);
j := 0; cpos := 0
ELSE INC(cpos)
END
END
ELSIF i # j THEN
LOOP s[j] := s[i]; IF s[j] = 0X THEN EXIT END;
INC(i); INC(j)
END
ELSE j := SHORT(Strings.Length(s))
END;
Files.WriteBytes(Output, s, j)
END PutSeq;
PROCEDURE PutPP*(s: ARRAY OF CHAR);
VAR i, j: INTEGER;
BEGIN
Wrap;
Files.Write(Output, "#");
IF indlevel # 0 THEN i := IndWidth END;
WHILE i # indlevel DO Files.Write(Output, " "); INC(i) END;
Files.WriteBytes(Output, s, Strings.Length(s));
Wrap
END PutPP;
PROCEDURE PutComment*(s: ARRAY OF CHAR);
VAR i: INTEGER;
str: ARRAY 4 OF CHAR;
BEGIN
i := 0;
str := "/* "; Files.WriteBytes(Output, str, Strings.Length(str));
WHILE s[i] # 0X DO
Files.Write(Output, s[i]);
IF (s[i] = "*") & (s[i+1] = "/") THEN Files.Write(Output, "@") END;
INC(i)
END;
str := " */"; Files.WriteBytes(Output, str, Strings.Length(str))
END PutComment;
BEGIN fold := FALSE; linenum := FALSE; macwrap := FALSE; unxwrap := TRUE
END COCO.